Welcome to pandas!

4.5 零宽断言与懒惰匹配

零宽断言正如它的名字一样,是一种零宽度的匹配,它匹配到的内容不会分组保存,最终匹配结果只是一个位置而已,匹配的内容只是给指定位置添加一个限定条件,用来规定此位置之前或者之后的字符必须满足限定条件,才能使正则表达式匹配成功。

名称 表达式 注释 备注
零宽正向先行断言 (?=exp) 它断言此位置后面匹配表达式exp  
零宽负向先行断言 (?!exp) 它断言此位置后面不匹配表达式exp  
零宽正向后行断言 (?<=exp) 它断言此位置前面匹配表达式exp 后向断言不支持不定长表达式
零宽负向后行断言 (? 它断言此位置前面不匹配表达式exp

import re

text= "张三100,李四32,王五56,麻子job23,小明"

t1=re.findall( "[一-龥]+(?=\d+)" ,text) #匹配的汉字后面是数字

t2=re.findall( "[一-龥]+(?!\d+)" ,text) #匹配的汉字后面不是数字

t3=re.findall( "(?<=[一-龥])\d+" ,text) #匹配连续的数字前面是汉字

t4=re.findall( "(? ,text) #匹配连续的数字前面不是汉字

print (t1)

print (t2)

print (t3)

print (t4)

返回:

['张三', '李四', '王五']

['张', '李', '王', '麻子', '小明']

['100', '32', '56']

['00', '2', '6', '23']


在对正则表达式进行长度匹配时,默认是贪婪模式,也就是尽可能地匹配更多的数据, 如果希望尽可能匹配更少的数据,可以在量词后面加问号(?),这就是懒惰模式,

名称 注释
*? 重复任意次,但尽可能少重复
+? 重复1次或多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n次到m次,但尽可能少重复
{n}? 重复n次以上,但尽可能少重复

import re

text= "1.张三2.李四3.王五4.麻子job5.小明6"

t1=re.findall( ".+(?=\d+)" ,text) #零宽断言贪婪匹配

t2=re.findall( ".+?(?=\d+)" ,text) #零宽断言懒惰匹配

print (t1)

print (t2)

返回:

['1.张三2.李四3.王五4.麻子job5.小明']

['1.张三', '2.李四', '3.王五', '4.麻子job', '5.小明']